package org.brisling.base.repository;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.query.Param;


/**
 * 
 * 基础数据仓库接口，所有数据仓库必须继承该接口
 * @author : jackson wang
 * @Date   : 2015年6月8日 下午11:02:15
 * @version: 1.0
 * @param <T> 业务数据仓库泛型实现类
 * @param <ID>业务数据仓库编码
 */

@NoRepositoryBean

public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
	
	/**
	 * 查找所有业务实体
	 * @return List 业务实体集合
	 */
	List<T> findAll();
	
	/**
	 * 根据id集合查找业务实体集合
	 * @param ids	业务实体id集合
	 * @return
	 */
	@Query("select u from #{#entityName} u where u.id in(:ids)")
	List<T> findById(@Param("ids")List<Long> ids);
	
	/**
	 * 查找所有业务实体
	 * @param page	分页参数
	 * @param sort	排序参数
	 * @return 业务对象实体集合
	 */
	Page<T> findAll(Pageable page);
	
	/**
	 * 查找所有业务实体
	 * @param sort	排序参数
	 * @return 业务对象实体集合
	 */
	List<T> findAll(Sort _sort);
	
	/**
	 * 
	 * 根据name值查找业务实体
	 * @param _name 业务name字段值
	 * @return 业务实体类
	 */
	T findByName(String _name);

	/**
	 * 根据名称集合查找实体集合
	 * @param names
	 * @return
	 */
	@Query("select u from #{#entityName} u where u.name in(:names)")
	List<T> findByName(@Param("names")List<String> names);
}
